1. РАБОТА С ТЕКСТОВЫМИ ФАЙЛАМИ

Концепция работы с файлами в Java включает две составляющие:


Работа с файлами и папками с помощью объектов типа File. Обеспечивает работу с именами файлов

(проверка существования файла или папки с заданным именем, нахождение абсолютного пути по

относительному и наоборот, проверка, и установка атрибутов файлов и папок);


Работа с потоками ввода/вывода. Обеспечивает взаимодействие не только с файлами, но и с

памятью, а также с различными устройствами ввода/вывода.


РАБОТА С ФАЙЛАМИ И ПАПКАМИ С ПОМОЩЬЮ ОБЪЕКТОВ ТИПА FILE

Объекты типа File могут рассматриваться как абстракции, инкапсулирующие работу с именами

файлов и папок. При этом папка считается разновидностью файла, обладающей особыми атрибутами.

Объект типа File создается с помощью конструкторов, имеющих следующие варианты:

• File(Имя папки);

• File(Имя файла);

• File(Имя папки, Имя файла).


При этом имена могут быть как короткими (локальными) без указания пути к файлу или папке, так и

длинными (абсолютными) с указанием пути. В таблице приведены важнейшие файловые операции,

заданные в классе File. При этом файлы (папки) ищутся по имени в соответствии с правилами поиска

файлов в операционной системе. Для платформы Windows символ \ в строках, соответствующих путям,

следует заменять последовательностью символов \\.


Важнейшие файловые операции, инкапсулированные классом File

Поле или метод Что содержит или делает
Переменные класса
String pathSeparator Содержит строку с символом разделителя пути в операционной системе. Это "/" в UNIX-подобных системах и "\" в Windows
char pathSeparatorChar Содержит символ разделителя пути в операционной системе. Это '/' в UNIX-подобных системах и '\' в Windows
String separator Содержит строку с символом разделителя между именами файлов и файловых масок в операционной системе
char separatorChar Содержит символ разделителя между именами файлов и файловых масок в операционной системе
Проверка параметров файла или папки
boolean exists() Возвращает true, когда файл (или папка) с заданным в конструкторе именем существует, иначе — false
long length() Возвращает длину файла в байтах в случае, когда файл с заданным в конструкторе именем существует и не является пап- кой, иначе — 0L
boolean canRead() Возвращает true, когда файл (или папка) с заданным в конструкторе именем существует и доступен по чтению, иначе — false. (В UNIX-подобных системах существуют файлы, доступные только по записи.) Может возбуждать SecurityException
boolean setReadOnly() Возвращает true в случае, когда файл (или папка) с заданным в конструкторе именем существует, и ему удалось установить статус "доступен только по чтению", иначе — false
boolean canWrite() Возвращает true, когда файл (или папка) с заданным в конструкторе именем существует и доступен по записи, иначе — false. (В операционных системах существуют файлы, доступные только по чтению.) Может возбуждать SecurityException
boolean canWrite() Возвращает true, когда файл (или папка) с заданным в конструкторе именем существует и доступен по записи, иначе — false. (В операционных системах существуют файлы, доступные только по чтению.) Может возбуждать SecurityException
boolean isDirectory() Возвращает true в случае, когда файл или папка с заданным в конструкторе именем существует и является папкой, иначе — false
boolean isFile() Возвращает true, когда файл или папка с заданным в конструкторе именем существует и является файлом, иначе — false
boolean isHidden() Возвращает true, когда файл или папка с заданным в конструкторе именем существует и является скрытым, иначе — false. В UNIX-образных системах скрытыми являются файлы, имена которых начинаются с точки, в Windows — те, которые имеют атрибут hidden (скрытый)
long lastModified() Возвращает время последней модификации файла, если он существует и доступен по чтению, иначе — 0L. Время отсчитывается в миллисекундах, прошедших с 0 часов 1 января 1970 года (по Гринвичу)
Boolean setLastModified( long time) Устанавливает время последней модификации файла. Возвращает true, если он существует и доступен по записи, иначе — false. Время отсчитывается в миллисекундах, прошедших с 0 часов 1 января 1970 года (по Гринвичу)
Путь и имя файла (папки)
String getName() Возвращает короткое имя файла или папки
String getParent() Возвращает абсолютное имя родительской папки, т. е. папки, в которой находится файл (или папка), соответствующий файловому объекту
String getAbsolutePath() Возвращает абсолютный путь к файлу или папке, включая имя файла. При этом если в имени файла в конструкторе была задана относительная адресация, то соответствующая часть пути сохраняется в возвращаемой строке
String getCanonicalPath() Возвращает абсолютный путь к файлу или папке, включая имя файла. При этом если в имени файла в конструкторе была задана относительная адресация, то соответствующая часть пути заменяется в возвращаемой строке на канонический вариант адресации — без элементов относительной адресации. Возбуждает IOException, если канонический путь не может быть построен
int compareTo(File f) Сравнивает имена файлов (папок), сопоставляемых текущему файловому объекту и объекту f. Возвращает 0 в случае, когда абсолютные имена файлов (папок) совпадают, иначе возвращает число, зависящее от разницы в длинах имен и кодов составляющих их символов. Сравнение зависимо от операционной системы — в UNIX-образных системах регистр символов имеет значение, в Windows — не имеет. Соответствие понимается абстрактно на уровне имен и путей (самих файлов может не существовать)
boolean isAbsolute() Возвращает true в случае, когда адресация к имени файла (папки) текущего файлового объекта является абсолютной. Хотя может содержать элементы относительной адресации, т. е. не быть канонической
boolean equals(Object obj) Возвращает true тогда и только тогда, когда текущий объект и параметр obj соответствуют одному и тому же файлу (папке) (с учетом правил о путях и регистрах символов, задаваемых операционной системой). Соответствие понимается абстрактно на уровне имен и путей (самих файлов может не существовать)
Создание/уничтожение/переименование файлов и папок
Boolean createNewFile() Предпринимает попытку создания файла или папки по имени, которое было задано в конструкторе объекта. В случае успеха возвращается true, иначе — false. Возбуждает IOException, если файл не может быть создан (например, уже существует)
File createTempFile( String prefix, String suffix) File createTempFile( String prefix, String suffix, File folder) Метод класса. Обеспечивает создание пустого файла (или папки), задаваемого коротким именем prefix+suffix в папке операционной системы, предназначенной для временных файлов. Возвращает ссылку на объект. Префикс должен быть не менее трех символов. Возбуждает IOException, если файл не может быть создан (например, уже существует)
boolean mkdir() Предпринимает попытку создания папки по имени, которое было задано в конструкторе объекта. Возвращает true в случае успешного создания и false в других случаях
boolean mkdirs() Предпринимает попытку создания папки по имени, которое было задано в конструкторе объекта, причем заодно создаются все папки, заданные в пути, если они не существовали. Возвращает true в случае успешного создания и false в других случаях
boolean delete() Предпринимает попытку удаления файла или папки по имени, которое было задано в конструкторе объекта. Возвращает true в случае успешного удаления и false в других случаях
boolean renameTo(File dest) Предпринимает попытку переименования файла или папки с имени, которое было задано в конструкторе объекта, на новое, задаваемое параметром dest. Возвращает true в случае успешного переименования и false в других случаях
Создание нового файлового объекта с помощью имеющегося
File getAbsoluteFile() Создает новый файловый объект по абсолютному пути, соответствующему текущему файловому объекту
File getCanonicalFile() Создает новый файловый объект по каноническому пути, соответствующему текущему файловому объекту. Возбуждает IOException, если канонический путь не может быть построен
File getParentFile() Создает новый файловый объект по абсолютному пути, соответствующему родительской папке для текущего файлового объекта
Списки папок и файлов
String[] list() String[] list( FilenameFilter filter) Возвращает массив строк (список) коротких имен, находящихся в папке файлов и папок. Имена элементов, находящихся во вложенных папках, не показываются. Если файловый объект не соответствует существующей папке, то возвращает null. При наличии фильтра возвращаются только те имена, которые соответствуют маске фильтра
File[] listFiles() File[] listFiles( FilenameFilter filter) Возвращает массив файловых объектов, соответствующих файлам и папкам, вложенным в ту папку, из файлового объекта которой делается вызов. Элементы, находящиеся во вложенных папках, не учитываются. Если текущий файловый объект не соответствует существующей папке, то возвращает null. При наличии фильтра возвращаются объекты только для тех имен, которые соответствуют маске фильтра
File[] listRoots() Возвращает массив файловых объектов, соответствующих возможным на данном компьютере корневым папкам. В UNIX это папка с именем "/", в Windows — корневые папки всех возможных дисков

ДИАЛОГОВОЕ ОКНО JFILECHOOSER

Swing включает мощное средство для работы с файлами - компонент JFileChooser -,

представляющий контейнер, в котором расположены несколько компонентов, списков и кнопок,

«управляющих» выбором файлов. JFileChooser можно добавить в любое место пользовательского

интерфейса, поскольку это весьма гибкий компонент, позволяющий тонко настраивать внешний вид. При

необходимости можно полностью изменить стандартное расположение входящих в JFileChooser

компонентов и добавить дополнительные элементы, такие как панели предварительного просмотра файлов.

Все стандартные диалоговые окна Swing имеют собственные UI-представители, отвечающие за

интерфейс окна в используемом приложении. Это особенно важно для внешних видов окон, имитирующих

известные платформы, пользователи которых не должны ощущать значительной разницы при переходе от

«родных» приложений к Java-приложения.

JFileChooser - это обычный компонент, унаследованный от класса JComponent, так что можно

включить его в любое место интерфейса. Настроить и вывести на экран несложное диалоговое окно для

открытия файла или сохранения в нем данных совсем легко.


Основные методы JFileChooser

Метод Описание
File getCurrentDirectory() Функция чтения текущей директории
String getDialogTitle() Функция чтения заголовка окна
int getDialogType() Функция чтения типа диалогового окна
FileFilter getFileFilter() Функция чтения текущего фильтра
File getSelectedFile() Функция чтения выделенного файла
File[] getSelectedFiles() Функция получения списка выделенных файлов, если установлен флаг выделения нескольких файлов MULTI_SELECTION_ENABLED_CHANGED_PROPERTY
void setCurrentDirectory(File dir) Метод определения текущей директории
void setDialogTitle(String dialogTitle) Метод определения заголовка диалогового окна
void setDialogType(int dialogType) Метод определения типа диалогового окна
void setFileFilter(FileFilter filter) Метод установки файлового фильтра
void setFileSelectionMode(int mode) Метод определения выделяемых объектов - файлы, директории или файлы с директориями
void setMultiSelectionEnabled(boolean b) Метод определения возможности выделения нескольких файлов
void setSelectedFile(File file) Метод выделения файла
void setSelectedFiles(File[] selectedFiles) Метод выделения списка файлов, если установлен флаг выделения нескольких файлов MULTI_SELECTION_ENABLED_CHANGED_PROPERTY
int showDialog(Component parent, String approveButtonText) Функция открытия окна выбора файла с настроенным наименованием кнопки
int showOpenDialog(Component parent) Функция открытия диалогового окна «Открыть файл»
int showSaveDialog(Component parent) Функция открытия диалогового окна «Сохранить файл»

Вовращаемые компонентом JFileChooser значения

• APPROVE_OPTION - выбор файла в диалоговом окне прошел успешно; выбранный файл можно получить методом getFile();

• CANCEL_OPTION - выбор файла отменен нажатием на кнопке Cancel;

• ERROR_OPTION - при выборе файла произошла ошибка, или было закрыто диалоговое окно выбора файла.


1.1. Пример суммы первых двух чисел из текстового файла

package tsn01.fsc;

import java.io.BufferedReader;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.Scanner;

public class App1 {

public static void main(String[] args) throws FileNotFoundException, IOException {

// Сумма 2 чисел из текстового файла

// Открытие входного файла

Scanner in = new Scanner(new BufferedReader(new FileReader("d:/input.txt")));

// Открытие выходного файла

PrintWriter out = new PrintWriter(new FileWriter("d:/output.txt"));

int a = in.nextInt(); // Считывает первое целое  число из файла

int b = in.nextInt(); // Считывает второе целое число из файла

out.println(a + b); // Заносит в выходной файл сумму двух значений, считанных из входного файла

in.close(); // Закрытие входного файла

out.flush(); // Сохранение выходного файла

out.close();// Закрытие выходного файла

}

}

1.2. Пример суммы всех целых чисел в текстовом файле

package tsn01.fsc;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.util.Scanner;

public class App1 {

public static void main(String[] args) throws FileNotFoundException, IOException {

// Сумма целых чисел тестового файла

try {

// Определение каталога запуска программы (текущего каталога)

String dir = new File(".").getAbsoluteFile().getParentFile().getAbsolutePath() + System.getProperty("file.separator");

// Открытие входного файла

Scanner in = new Scanner(new FileInputStream(dir + "input.txt"));

// Открытие выходного файла

PrintWriter out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(dir + "output.txt")));

int s = 0; // Переменная для суммы чисел

while (in.hasNextInt()) { // Пока есть целые числа в файле

// Считывает текущее целое значение из файла и добавляет его в переменную

s += in.nextInt();

}

out.println(s); // Вывод в выходной файл суммы всех чисел входного файла

System.out.println("Sum = " + s); // Вывод на экран суммы всех чисел входного файла

out.flush(); // Сохранение выходного файла

out.close(); // Закрытие выходного файла

in.close(); // Закрытие входного файла

} catch (Exception e) { // Если будет ошибка

System.out.println("Error ..."); // Сообщение в случаи ошибки

};

}

}

1.3. Пример копирования данных из файла в файл

package tsn01.fsc;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.util.Scanner;

public class App1 {

public static void main(String[] args) throws FileNotFoundException, IOException {

// Копирование данных из файла в файл

try {

// Определение каталога запуска программы (текущего каталога)

String dir = new File(".").getAbsoluteFile().getParentFile().getAbsolutePath()+ System.getProperty("file.separator");

// Открытие входного файла

Scanner in = new Scanner(new FileInputStream(dir + "input.txt"), "cp866"); // или «cp1251»

// Открытие выходного файла

PrintWriter out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(dir + "output.txt"), "cp866")); // или «cp1251»

while (in.hasNext()) { // Пока есть строки в файле

// Считывает текущее текстовое значение из входного файла и добавляет его в конец выходного файла

String s = in.next(); // Чтение текстового данного из входного файла

System.out.println(s); // Вывод  считанного данного на экран

out.println(s);// Добавление считанного данного в выходной файл

}

out.flush(); // Сохранение выходного файла

out.close(); // Закрытие выходного файла

in.close(); // Закрытие входного файла

} catch (Exception e) { // Если будет ошибка

System.out.println("Error ..."); // Сообщение в случаи ошибки

};

}

}

1.4. Пример визуальной программы работы с файлами и массивами

Описание: C:\Documents and Settings\User\Рабочий стол\eps\src\eps\doc\lectures\Работа с файлами.files\image001.jpg

public class Form1 extends javax.swing.JFrame {

 

public String FileName, DirName; // Имя входного файла с данными и его каталог

public int mass[][] = new int[5][6]; // Массив для обработки данных

public Form1() {

initComponents();

}

private void jButton_InputActionPerformed(java.awt.event.ActionEvent evt) {

// Загрузка исходных данных из файла в массив

JFileChooser chooser = new JFileChooser(); // Создаем объект выбора файла

// Устанавливаем текущий каталог

chooser.setCurrentDirectory(new File(".").getAbsoluteFile().getParentFile());

chooser.setFileFilter(new FileNameExtensionFilter("TXT files", "txt")); // Устанавливаем фильтр

chooser.setDialogTitle("Выбор файла"); // Устанавливаем значение диалогу

chooser.setAcceptAllFileFilterUsed(false); // Выключаем значение "все файлы" в фильтре

int ret = chooser.showDialog(null, "Выбрать"); // Вызываем диалог

if (ret != JFileChooser.APPROVE_OPTION) {

return;

} // Если файл не выбран, то выход

FileName = chooser.getSelectedFile().getPath(); // Получение имени файла

DirName = chooser.getSelectedFile().getParent() + System.getProperty("file.separator"); // Получение каталога файла

try {

Scanner fIN = new Scanner(new FileInputStream(FileName));

// Читаем с файла данные

for (int i = 0; i < 5; i++) {

for (int j = 0; j < 6; j++) {

mass[i][j] = fIN.nextInt();

}

}

// Вывод считанного массива

jTextArea_Out.setText("Исходные данные из файла:\n");

for (int i = 0; i < 5; i++) {

for (int j = 0; j < 6; j++) {

jTextArea_Out.append(String.format("%5d", mass[i][j]));

} jTextArea_Out.append("\n");

}

} catch (Exception ex) {

jTextArea_Out.setText("Error read file!");

}

}

private void jButton_TaskActionPerformed(java.awt.event.ActionEvent evt) {

// Запись обработанного массива в выходной файл

try {

PrintWriter fOUT = new PrintWriter(new OutputStreamWriter(new FileOutputStream(DirName + "output.txt")));

// Вывод результирующего массива в файл

for (int i = 0; i < 5; i++) { fOUT.println("");

for (int j = 0; j < 6; j++) {

fOUT.print(String.format("%5d", mass[i][j]));

}

}

// Сохранение и закрытие файла

fOUT.flush(); fOUT.close();

// Вывод результирующего массива на экран

jTextArea_Out.append("\nОбработанные данные:\n");

for (int i = 0; i < 5; i++) {

for (int j = 0; j < 6; j++) {

jTextArea_Out.append(String.format("%5d", mass[i][j]));

} jTextArea_Out.append("\n");

}

} catch (Exception ex) {

jTextArea_Out.setText("Error read file!");

}

}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

// Обработка данных

int s = 0; // Считаем сколько едениц во втором столбце

for (int i = 0; i < 5; i++) { if (mass[i][1] == 1) { s++; } }

if (s == 5) { // Если их 5 тогда ищем макс и мин элемент и меняем их на 100 и 5

int min = mass[0][0], minI = 0, minJ = 0, max = mass[0][0], maxI = 0, maxJ = 0;

for (int i = 0; i < 5; i++) {

for (int j = 0; j < 6; j++) {

if (mass[i][j] > max) { max = mass[i][j]; maxI = i; maxJ = j; }

if (mass[i][j] < min) { min = mass[i][j]; minI = i; minJ = j; }

}

} mass[maxI][maxJ] = 100;  mass[minI][minJ] = 5;

}

}

2. РАБОТА С ФАЙЛАМИ ПАРАМЕТРОВ

Часто в приложениях возникает необходимость сохранять настройки в файл и считывать их оттуда.  Когда приложение запускается - оно считывает настройки из файла с параметрами, а когда закрывается - записывает нужные параметры в файл.

В приложениях на языке Java параметры сохраняются в так называемых «файлах свойств (параметров)».

Файлы параметров - это обычные текстовые файлы с расширением «.properties» или «.conf», которые можно редактировать и просматривать при помощи любого текстового редактора.

Файл параметров представляет собой пары "ключ=значение", где ключ - это имя какого-то параметра. Файлы «.properties» имеют следующий формат:

# Начало файла ".properties".

# Это комментарий

! Восклицательный знак тоже можно отметить как комментарий.

website = http://mail.ru/

language = Russian

# Обратная косая черта указывает на продолжение значения параметра на следующей строке.

message = Добро пожаловать в \

мир Java!

# Добавление пробелов в ключе

key\ with\ spaces = Это значение должно искаться ключом "key with spaces".

# Юникод

tab = \u0009

В приведенном выше примере, «website» является ключем, а «http://mail.ru/» - значением.

В то время как знак номера (#) и восклицательный знак (!) отмечают текст как комментарии, это не имеет никакого эффекта, если это  - значение параметра. Таким образом, значение ключа «message» будет «Добро пожаловать в мир Java, а не «Добро пожаловать в мир Java». Нужно заметить также, что все пробелы перед «мир Java полностью исключены.

Работа с файлами свойств в Java осуществляется с помощью специального класса - Properties. В этом классе есть методы, которые позволяют считать параметр и задать его - это методы getProperty() и setProperty().

2.1. Пример работы с файлом параметров в консольном приложении

package tsn01.prop;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.util.Date;

import java.util.Properties;

class Props {     // РАБОТА С ФАЙЛАМИ НАСТРОЕК

// Получение каталога расположения файла параметров (место запуска программы)

String dir = new File(".").getAbsoluteFile().getParentFile().getAbsolutePath()

+ System.getProperty("file.separator");

// Получение каталога расположения файла параметров (рабочий каталог пользователя)

//String dir = System.getProperty("user.home") + System.getProperty("file.separator");

String FileName = dir + "tsn_demo.prop"; // Имя файла с настройками

// Объект для хранения параметров со значениями (имена параметров чувствительны к регистру)

Properties p = new Properties();

{ System.out.println("Каталог с файлом параметров: " + dir); }

public void WriteProps() { // ЗАПИСЬ ФАЙЛА НАСТРОЕК

try {

File f = new File(FileName); // Создаем объект доступа к файлу параметров

if (f.exists() == false) { f.createNewFile(); } // Если нет файла, то создаем его

else p.load(new FileInputStream(FileName)); // Если есть, то загрузить файл с параметрами

p.put("date", new Date().toString()); // Записать (обновить) параметр "date"

p.put("name", "Сергей"); // Записать (обновить) параметр "name"

p.put("name.pass", "pass123"); // Записать (обновить) параметр "name.pass"

// Сохранить файл с настройками

p.store(new FileOutputStream(FileName), "/* properties updated */");

} catch (Exception e) { // Если ошибка

System.out.println(e); // Вывести сообщения об ошибке

}

}

public void ReadProps() { // ЧТЕНИЕ ФАЙЛА НАСТРОЕК

try {

p.load(new FileInputStream(FileName)); // Загрузить файл с параметрами

System.out.println("date = " + p.getProperty("date")); // Считать параметр "date"

System.out.println("name = " + p.getProperty("name")); // Считать параметр "name"

System.out.println("name.pass = " + p.getProperty("name.pass")); // Считать параметр "name.pass"

} catch (Exception e) { // Если ошибка

System.out.println(e); // Вывести сообщения об ошибке

}

}

}

public class App1 {

public static void main(String[] args) {

System.out.println("Информация о системе:");

System.out.println("Версия Java: " + System.getProperty("java.version"));

System.out.println("Каталог, в который установлена система Java: " + System.getProperty("java.home"));

System.out.println("Версия OS: " + System.getProperty("os.name"));

System.out.println("Архитектура ОС: " + System.getProperty("os.arch"));

// РАБОТА С ФАЙЛОМ ПАРАМЕТРОВ

Props props = new Props(); // Создание объекта работы с файлом параметров

props.WriteProps(); // Записать параметры в файл

props.ReadProps(); // Считать параметры из файла

}

}

На экран будет выведено следующее:

Информация о системе:

Версия Java: 1.7.0_25

Каталог, в который установлена система Java: C:\Program Files\Java\jdk1.7.0_25\jre

Версия OS: Windows XP

Архитектура ОС: x86

Каталог с файлом параметров: D:\NetBeansProjects\1\TSN01_Prop\

date = Sat Oct 05 23:39:58 ALMT 2013

name = Сергей

name.pass = pass123

В результате работы программы получится следующий файл с параметрами «tsn_demo.prop»:

#/* properties updated */

#Sat Oct 05 20:28:50 ALMT 2013

name=\u0421\u0435\u0440\u0433\u0435\u0439

date=Sat Oct 05 20\:28\:50 ALMT 2013

name.pass=pass123

3. РАБОТА С XML-ФАЙЛАМИ

Язык XML (eXtensible Markup Language) - это универсальный язык разметки, который является современным стандартом для работы с данными.  Файлы XML –  это текстовые файлы с данными, записанными в формате языка XML. В файлах XML находится описание структуры хранимых данных, и сами данные. Файлы XML используются для хранения структурированных данных и для обмена информацией между программами.

Язык XML имеет следующие достоинства:

·         международный промышленный стандарт;

·         кросс платформенный формат;

·         поддерживает Юникод (символы всех языков);

·         человеко-ориентированный формат документа.

Пример XML-документа:

<?xml version="1.0" encoding="utf-8"?>

<pricelist>

<book id="1">

<title>Книга 1</title>

<author>Автор 1</author>

<price>Цена 1</price>

</book>

<book id="2">

<title>Книга 2</title>

<author>Автор 2</author>

<price>Цена 2</price>

</book>

<book id="3">

<title>Книга 3</title>

<author>Автор 3</author>

<price>Цена 3</price>

</book>

</pricelist>

3.1. Пример работы с xml-файлом в консольном приложении

package tsn01.prop;

 

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.Date;

import java.util.Properties;

public class App1 {

// Каталог запуска программы

String dir = new File(".").getAbsoluteFile().getParentFile().getAbsolutePath()

+ System.getProperty("file.separator");

String FileName = dir + "tsn_demo.xml"; // Имя файла с настройками

File f = new File(FileName); // Создаем объект доступа к файлу параметров

// Объект для хранения параметров со значениями (имена параметров чувствительны к регистру)

Properties p = new Properties();

void writeXML() { // СОХРАНЕНИЕ (ОБНОВЛЕНИЕ) ДАННЫХ В XML-ФАЙЛЕ

try {

if (f.exists() == false) { f.createNewFile(); } // Если нет XML-файла, то создаем его

else { p.loadFromXML(new FileInputStream(FileName)); } // Считываем значения из XML-файла, если он есть

p.setProperty("fio", "Talipov S.N."); // Установка параметра "fio"

p.setProperty("age", "38"); // Установка параметра "age"

p.storeToXML(new FileOutputStream(FileName), new Date().toString()); // Сохраняем XML-файл

} catch (Exception e) { // Если ошибка

System.err.println("Error store to XML!"); // Вывести сообщения об ошибке

}

}

void readXML() { // СЧИТЫВАНИЕ ДАННЫХ ИЗ XML-ФАЙЛА

try {

p.loadFromXML(new FileInputStream(FileName)); // Загружаем значения из XML-файлв

System.out.println(p.getProperty("fio", "???")); // Считываем и выводим на экран параметр "fio"

System.out.println(p.getProperty("age", "0")); // Считываем и выводим на экран параметр "age"

} catch (Exception e) { // Если ошибка

System.err.println("Error load from XML!"); // Вывести сообщения об ошибке

}

}

public static void main(String[] args) {

// РАБОТА С XML-ФАЙЛОМ

App1 MyApp = new App1(); // Создание объекта работы с файлом параметров

MyApp.writeXML(); // Записать параметры в XML-файл

MyApp.readXML(); // Считать параметры из XML-файла

}

}

На экран будет выведено следующее:

Talipov S.N.

38

В результате работы программы получится следующий файл с параметрами «tsn_demo.xml»:

Описание: C:\Documents and Settings\User\Рабочий стол\eps\src\eps\doc\lectures\Работа с файлами.files\image002.jpg

3.2. Пример загрузки xml-файла с jar-ресурса

private void formWindowOpened(java.awt.event.WindowEvent evt) {

// Загрузка xml-файла из jar-ресурсов

try { // Получаем имя xml-файла из jar-ресурсов

InputStream XMLstream = getClass().getResourceAsStream("tsn_demo.xml");

Properties XML = new Properties(); // Создание объекта работы с параметрами

XML.loadFromXML(XMLstream); // Загрузка файла из ресурса

// Вывод значения параметра "fio"

JOptionPane.showMessageDialog(rootPane, XML.getProperty("fio", "???"), "ФИО",

JOptionPane.INFORMATION_MESSAGE);

XMLstream.close(); // Закрываем доступ к XML-файлу

} catch (Exception ex) { JOptionPane.showMessageDialog(rootPane, "Ошибка чтения XML-файла", "Ошибка ввода", JOptionPane.ERROR_MESSAGE);

}

}